const Koa = require('koa');
const logger = require('koa-logger');
const json = require('koa-json');
const onerror = require('koa-onerror');
const koaBody = require('koa-body').default || require('koa-body');
const cors = require('@koa/cors');
const jwt = require('koa-jwt');
const path = require('path');
const dotenv = require('dotenv');

dotenv.config();

const tasks = require('./routes/tasks');
const users = require('./routes/users');
const start = require('./routes/start');

const app = new Koa();
const secretKey = process.env.JWT_SECRET || 'mysecretkey';

// 错误处理
onerror(app);

// 使用 CORS 中间件
app.use(cors({
  origin: '*', // 允许所有来源
}));

// 使用 koa-body 中间件来解析请求体
app.use(koaBody({
  multipart: true,         // 支持 multipart/form-data
  urlencoded: true         // 支持 application/x-www-form-urlencoded
}));

app.use(json());
app.use(logger());

// 静态文件服务
app.use(require('koa-static')(path.join(__dirname, '/public')));


// JWT认证中间件（排除 /api/users/login, /api/users/register 和根路径 /）
app.use(jwt({ secret: secretKey }).unless({ path: [/^\/api\/users\/(login|register)/, /^\/$/] }));


// 404 处理
app.use(async (ctx, next) => {
  await next();
  if (ctx.status === 404) {
    ctx.body = { message: 'Not Found' };
  }
});

// 请求日志
app.use(async (ctx, next) => {
  const start = new Date();
  await next();
  const ms = new Date() - start;
  console.log('%s %s - %sms', ctx.method, ctx.url, ms);
});

// 路由
app.use(tasks.routes()).use(tasks.allowedMethods());
app.use(users.routes()).use(users.allowedMethods());
app.use(start.routes()).use(start.allowedMethods());

// 错误处理
app.on('error', (err, ctx) => {
  console.error('server error', err, ctx);
});

module.exports = app;




